#!/usr/bin/python
# -*- coding:utf-8 -*-
###################################
#
# 检查主机的损坏磁盘
#
###################################
 
import paramiko
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import os

_XFER_FILE = 'FILE'
_XFER_DIR  = 'DIR'
# 创建目标路径
# 说明: 目标路径不存在则依次创建路径目录
def __makePath(sftp,target):
        print'target path: %s' % target
        try:
        # 切换根目录
            sftp.chdir('/')
            print u'当前的工作目录:'
        except Exception as e:
            print'open root  dir fail:'+e

        # 分割目标目录为目录单元集合
        data = target.split('/')
        print 'target data: %s' % data
        # 进入目标目录, 目录不存在则创建
        for item in data:
            try:
                sftp.chdir(item) 
                print u'要上传的目录已经存在，选择性进入合并：' + item
            except:
                if len(item) > 0:
                    print u'要上传的目录不存在，创建目录：' + item
                    sftp.mkdir(item)
                    sftp.chdir(item) 

# ------获取本地指定目录及其子目录下的所有文件------
def __get_all_files_in_local_dir(local_dir):
		# 保存所有文件的列表
        all_files = list()
		# 获取当前指定目录下的所有目录及文件，包含属性值
        files = os.listdir(local_dir)
        for x in files:
			# local_dir目录中每一个文件或目录的完整路径
            filename = os.path.join(local_dir, x)
			# 如果是目录，则递归处理该目录
            if os.path.isdir(x):
                print u'这是个目录'+filename
                all_files.extend(__get_all_files_in_local_dir(filename))
            else:
                all_files.append(filename)
        return all_files


def DiskCheck(ip,rsa,local_file,remote_file,rsapassword):
    try:
        # 建立一个sshclient对象
        ssh = paramiko.SSHClient()
        # 允许将信任的主机自动加入到host_allow 列表，此方法必须放在connect方法的前面
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码，password为设定的密码，如无不用指定password参数
        # pkey = paramiko.RSAKey.from_private_key_file('/home/super/.ssh/id_rsa', password='12345')
        pkey = paramiko.RSAKey.from_private_key_file(rsa, password=rsapassword)
        # 建立连接
        ssh.connect(hostname=ip,
                    port=22,
                    username='dev',
                    pkey=pkey)
        # 执行命令
        stdin, stdout, stderr = ssh.exec_command("for i in $(df -h|grep data|awk '{print $6}'); do  touch $i/test.txt; done; df -h|grep data")
        # 结果放到stdout中，如果有错误将放到stderr中
        sftp = paramiko.SFTPClient.from_transport(ssh.get_transport())
        sftp = ssh.open_sftp()
        __makePath(sftp,remote_file)
        upload(local_file, remote_file, False, sftp)

        # all_file = __get_all_files_in_local_dir(local_file)
        # print(u'上传x：',all_file)
        # for x in all_file:
        #     filename = os.path.split(x)[-1]
        #     remote_filename = remote_file + '/' + filename
        #     print u'传送单个文件的'+filename
        #     sftp.put(x, remote_filename)
    
        
        # 关闭连接
        ssh.close()
    except Exception,e:
        print('连接失败:',e)


    # 处理上传
def upload(source, target, replace, sftp):
        # 来源路径
        source = source.replace('\\', '/')
        # 目标路径
        target = target.replace('\\', '/')

        ### 验证数据
        if not os.path.exists(source):
            print u'来源资源不存在，请检查：' + source
            return

        ### 处理数据
        # 文件媒体数据(文件类型, 文件名称)
        filetype, filename = __filetype(source)
        # 判断文件类型
        if filetype == _XFER_DIR:
            # 1.目录 
            uploadDir(sftp, source, target, replace)
        elif filetype == _XFER_FILE:
            # 2.文件 
            uploadFile(source, filename, replace, sftp)

# 传送目录
def uploadDir(sftp,source, target, replace):
        ### 验证数据
        # 判断目录存在
        if not os.path.isdir(source):   
            print u'这个函数是用来传送本地目录的'
            return

        ### 处理数据
        # 遍历目录内容，上传资源
        for file in os.listdir(source):
            # 资源路径
            filepath = os.path.join(source, file) 

            # 判断资源文件类型
            if os.path.isfile(filepath): 
                # 1.文件
                uploadFile(filepath, file, replace, sftp) 
            elif os.path.isdir(filepath):
                # 2.目录
                try:
                    sftp.chdir(file) 
                except:
                    sftp.mkdir(file)
                    sftp.chdir(file) 
                uploadDir(sftp,filepath, file, replace)
        # 返回上一层目录
        sftp.chdir('..') 

 # 传送文件
def uploadFile(filepath, filename, replace, sftp):
        # 验证文件类型
        if not os.path.isfile(filepath):
            print u'这个函数是用来传送单个文件的'
            return
        # 验证文件存在
        if not os.path.exists(filepath):
            print u'err:本地文件不存在，检查一下'+filepath
            return
        # 验证FTP已连接
        if sftp == None:
            print u'sftp 还未链接'
            return

        ### 处理数据
        # 判断文件存在是否覆盖
        # if not replace:
        #     if filename in sftp.listdir():
        #         print u'[*] 这个文件已经存在了，选择跳过:' + filepath + ' -> ' + sftp.getcwd() + '/' + filename
        #         return
        # 上传文件
        try:
            sftp.put(filepath, filename)
            print u'[+] 上传成功:' + filepath + ' -> ' + sftp.getcwd() + '/' + filename
        except Exception as e:
            print u'[+] 上传失败:' + filepath + ' because ' + str(e)

def __filetype(source):
        # 判断文件类型
        if os.path.isfile(source):
            # 1.文件
            index = source.rfind('/')
            return _XFER_FILE, source[index+1:]
        elif os.path.isdir(source):  
            # 2.目录
            return _XFER_DIR, ''                            
if __name__ =='__main__':
    #if len(sys.argv) != 2:
    #    print 'Usage: python CheckDisk.py ip'
        #sys.exit()
    print 'ip: %s' % sys.argv[1]
    print 'rsa: %s' % sys.argv[2]
    print 'local: %s' % sys.argv[3]
    print 'severpath: %s' % sys.argv[4]
    print 'rsaPassword: %s' % sys.argv[5]
    DiskCheck(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5])
    print '-' * 80





